home *** CD-ROM | disk | FTP | other *** search
/ A.C.E. 2 / ACE CD 2.iso / FILES / UTILS / AMOSPRO6.DMS / in.adf / Procedures / Bobs / Rmask.S < prev    next >
Encoding:
Text File  |  1992-09-29  |  2.8 KB  |  148 lines

  1. ; ____________________________________________________________________________
  2. ;
  3. ;     AMOS Complex mask calculation
  4. ;
  5. ;    [Number,Colour0,Colour1]
  6. ; ____________________________________________________________________________
  7.  
  8.     OPT    P+
  9.     Include    "|AMOS_Includes.s"
  10. ; ____________________________________________________________________________
  11.  
  12.  
  13. ; Look for the sprite bank
  14. ; ~~~~~~~~~~~~~~~~~~~~~~~~
  15.     bsr    Bnk_GetBobs
  16.     beq    Erreur
  17. ; Get the parameters back
  18. ; ~~~~~~~~~~~~~~~~~~~~~~~
  19.     move.l    (a3)+,d2    Colour 2
  20.     move.l    (a3)+,d1    Colour 1
  21.     move.l    (a3)+,d0    Number of the bob
  22. ; Parameter check
  23. ; ~~~~~~~~~~~~~~~
  24.     tst.w    d0
  25.     ble    Erreur
  26.     cmp.w    (a0)+,d0    > of available sprites 
  27.     bhi    Erreur        
  28.     lsl.w    #3,d0
  29.     lea    -8(a0,d0.w),a5    Adress of the bobs
  30.     move.l    (a5)+,d0
  31.     beq    Erreur
  32.     move.l    d0,a4        A4= SpriteBase
  33.  
  34. * Built up table
  35.     lea    Table(pc),a0
  36.     cmp.l    (a0),d1
  37.     bne.s    DoTable
  38.     cmp.l    4(a0),d2
  39.     beq.s    PaTable
  40. DoTable    move.l    d1,(a0)+
  41.     move.l    d2,(a0)+
  42.     moveq    #64-1,d0
  43. Table0    clr.b    (a0)
  44.     lsr.l    #1,d1
  45.     roxr.l    #1,d2
  46.     bcc.s    Table1
  47.     subq.b    #1,(a0)
  48. Table1    addq.l    #1,a0
  49.     dbra    d0,Table0
  50. PaTable
  51.  
  52. * Calculation of mask size
  53.     move.w    (a4),d7        TX
  54.     lsl.w    #1,d7        En mots
  55.     mulu    2(a4),d7    fois TY
  56.  
  57. * Reserve memory (if needed)
  58.     move.l    (a5),d0
  59.     beq.s    Reserve
  60.     bpl.s    DejaLa
  61. Reserve    move.l    d7,d0
  62.     addq.l    #4,d0
  63.     move.l    d0,d2
  64.     move.l    $4,a6
  65.     move.l    #Chip|Public,d1        CHIP memory only
  66.     jsr    _LVOAllocMem(a6)
  67.     move.l    d0,(a5)
  68.     beq    Erreur
  69.     move.l    d0,a0
  70.     move.l    d2,(a0)+    Loke the size 
  71. DejaLa    move.l    d0,a2
  72.     addq.l    #4,a2
  73.  
  74. * Loop initialisation
  75.     move.l    d7,d6        D6-> Size of one memory plane
  76.     subq.l    #1,d7        D7-> Byte counter
  77.     move.w    4(a4),d5    Number of planes
  78.     subq.w    #1,d5        D5-> Plane counter reload
  79.     lea    10(a4),a1    A1-> Bitmap base
  80. ;                A2-> Mask address
  81.     lea    Table+8(pc),a3    A3-> Mask table
  82.  
  83. * Calculation loop
  84. .loop0    moveq    #7,d3        D3-> Bit counter
  85. .loop1    moveq    #0,d0        D0-> Color calculation
  86.     moveq    #0,d1        D1-> Bit position
  87.     move.w    d5,d2        D2-> Plane counter
  88.     move.l    a1,a0        A0-> Point to current byte
  89. .loop2    btst    d3,(a0)
  90.     beq.s    .loop3
  91.     bset    d1,d0
  92. .loop3    add.l    d6,a0        Next plane
  93.     addq.w    #1,d1
  94.     dbra    d2,.loop2
  95.  
  96.     bset    d3,(a2)
  97.     tst.b    0(a3,d0.w)    Transparent colour?    
  98.     beq.s    .loop4
  99.     bclr    d3,(a2)
  100. .loop4
  101.     dbra    d3,.loop1    Still one bit?
  102.     addq.l    #1,a1
  103.     addq.l    #1,a2
  104.     dbra    d7,.loop0    Still one byte?
  105.  
  106. * All done, no errors
  107.     moveq    #0,d0
  108.     rts
  109. * An error
  110. Erreur    moveq    #-1,d0
  111.     rts
  112.  
  113. ; Finds a bank adress
  114. ; ~~~~~~~~~~~~~~~~~~~
  115. Bnk_GetAdr
  116.     move.l    Cur_Banks(a5),a0
  117.     move.l    (a0),d1
  118.     beq.s    .Nof
  119. .Loop    move.l    d1,a1
  120.     cmp.l    8(a1),d0
  121.     beq.s    .Fnd
  122.     move.l    (a1),d1
  123.     bne.s    .Loop
  124. .Nof    sub.l    a1,a1
  125.     move.l    a1,a0
  126.     rts
  127. .Fnd    move.w    8+4(a1),d0
  128.     lea    8*3(a1),a0
  129.     move.l    a0,a1
  130.     move.w    #%00000,CCR
  131.     rts
  132. ; Finds bob bank address
  133. ; ~~~~~~~~~~~~~~~~~~~~~~
  134. ;    OUT    BNE found A0/A1=address (D0/D1 unchanged)
  135. Bnk_GetBobs
  136.     movem.l    d0/d1,-(sp)
  137.     moveq    #1,d0
  138.     bsr    Bnk_GetAdr
  139.     beq.s    .Nof
  140.     btst    #Bnk_BitBob,d0
  141. .Nof    movem.l    (sp)+,d0/d1
  142.     rts
  143.  
  144. ******* Work table
  145.     even
  146. Table    ds.b    64+8
  147.     even
  148.